import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from scipy.fftpack import fft2
moon = plt.imread('../data/moonlanding.png')
plt.figure(figsize=(10,8))
plt.imshow(moon, cmap='gray')
# 第一步: 使用傅里叶变换,把图片变成频率
# 第二步,把高频点(噪点) 赋值为0
# 第三步, 进行傅里叶逆变换
# 第四步, 去虚保实
moon
moon_fft = fft2(moon)
moon_fft
# 绝对值大于某一频率(阈值)的点我们认为是高频点即噪点
moon_fft[np.abs(moon_fft) > 8e2] = 0
moon_fft
result = np.where(np.abs(moon_fft) > 8e3, 0, moon_fft)
result
np.argwhere()
# 逆变换
from scipy.fftpack import ifft2
moon_ifft = ifft2(result)
moon_ifft
# 去虚保实
moon_cleaned = np.real(moon_ifft)
plt.figure(figsize=(10,8))
plt.imshow(moon, cmap='gray')
plt.figure(figsize=(10,8))
plt.imshow(moon_cleaned, cmap='gray')
scipy.fftpack模块用来计算快速傅里叶变换
速度比传统傅里叶变换更快,是对之前算法的改进
图片是二维数据,注意使用fftpack的二维转变方法
np.pi
S = pi * r^2
S = pi
求半径是1的圆的面积.
让圆的圆心在原点处
(x - a)^2 + (y - b)^2 = r^2
x^2 + y^2 = 1
y = (1 - x ^2 )^0.5
x = np.linspace(-1,1, 100)
y = (1 - x**2)**0.5
plt.plot(x, y, x, -y)
plt.axis('equal')
X2 + Y2 = 1,半径是1
pi×r**2,只要求得面积--->pi
from scipy import integrate
首先画一个圆
圆的面积是?
使用scipy.integrate进行积分,调用quad()方法
f = lambda x: (1 - x**2)**0.5
half_pi, deviation = integrate.quad(f, -1, 1)
half_pi * 2
half_pi
np.pi
deviation
随机生成数组,使用scipy中的io.savemat()保存
文件格式是.mat,标准的二进制文件
.mat
import scipy.io as spio
spio.savemat('./moon.mat', {'moon': moon_cleaned})
使用io.loadmat()读取数据
data = spio.loadmat('./moon.mat')
data
plt.figure(figsize=(10,8))
plt.imshow(data['moon'], cmap='gray')
from scipy import misc
from PIL import Image, ImageFilter
cat = Image.open('../data/cat.jpg')
cat
# 各种滤镜效果
cat.filter(ImageFilter.BLUR)
使用scipy.misc.face(gray=True)获取图片,使用ndimage移动坐标、旋转图片、切割图片、缩放图片
导包,读取图片显示图片
face = misc.face()
plt.figure(figsize=(10,8))
plt.imshow(face)
shift移动坐标
# {'reflect', 'constant', 'nearest', 'mirror', 'wrap'}
face_shift = ndimage.shift(face, (200, 300, 0), mode='wrap')
plt.figure(figsize=(10,8))
plt.imshow(face_shift)
rotate旋转图片
face_rotate = ndimage.rotate(face, angle=60)
plt.figure(figsize=(10,8))
plt.imshow(face_rotate)
zoom缩放图片
face = misc.face(gray=True)
plt.figure(figsize=(10,8))
plt.imshow(face, cmap='gray')
face_zoom = ndimage.zoom(face, zoom=(0.6, 0.8))
plt.figure(figsize=(10,8))
plt.imshow(face_zoom, cmap='gray')
切割图片
face_cut = face[270:480, 480:760]
plt.figure(figsize=(10,8))
plt.imshow(face_cut, cmap='gray')
图片进行过滤
添加噪声,对噪声图片使用ndimage中的高斯滤波、中值滤波、signal中维纳滤波进行处理
使图片变清楚
face_noise = face.copy()
face_noise = face_noise.astype('float64')
face_noise += np.random.randn(*face_noise.shape) * face_noise.std() * 0.5
face_noise.std()
face = misc.face(gray=True)
plt.figure(figsize=(10,8))
plt.imshow(face_noise, cmap='gray')
加载图片,使用灰色图片misc.face()添加噪声
高斯滤波sigma:高斯核的标准偏差
face_gaussian = ndimage.gaussian_filter(face_noise, sigma=1)
plt.figure(figsize=(10,8))
plt.imshow(face_gaussian, cmap='gray')
中值滤波参数size:给出在每个元素上从输入数组中取出的形状位置,定义过滤器功能的输入
face_median = ndimage.median_filter(face_noise, size=5)
plt.figure(figsize=(10,8))
plt.imshow(face_median, cmap='gray')
signal维纳滤波mysize:滤镜尺寸的标量
from scipy import signal
face_wiener = signal.wiener(face_noise, mysize=5)
plt.figure(figsize=(10,8))
plt.imshow(face_wiener, cmap='gray')
cat
cat = plt.imread('../data/cat.jpg')
cat_rotate = ndimage.rotate(cat, angle=90)
plt.imshow(cat_rotate)